package com.itheima.tlias.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itheima.tlias.domain.Emp;
import com.itheima.tlias.entity.PageBean;
import com.itheima.tlias.mapper.EmpMapper;
import com.itheima.tlias.service.EmpService;
import com.itheima.tlias.utils.JwtUtils;
import com.itheima.tlias.vo.Result;
import com.mysql.cj.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * @author ghy
 * @version 1.0.1
 * @date 2024-01-28 10:43:18
 */
@Service
@Transactional
@Slf4j
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public Result page(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
        log.info("EmpServiceImpl page -->page:{}, pageSize:{}", page, pageSize);
        // 一.校验参数
        // 二.处理业务
        //设置分页参数，这行代码必须写在查询功能之前，中间不能有其他内容
        PageHelper.startPage(page, pageSize);
        List<Emp> emps = empMapper.findCondition(name, gender, begin, end);
        //PageInfo就是分页插件提供的分页结果对象
        PageInfo<Emp> pageInfo = new PageInfo<>(emps);
        // 三.封装数据
        PageBean pageBean = new PageBean(pageInfo.getTotal(), pageInfo.getList());
        return Result.success(pageBean);
    }

    @Override
    public Result findById(Integer id) {
        Emp emp = empMapper.findById(id);
        return Result.success(emp);
    }

    @Override
    public Result update(Emp emp) {
        // 一.校验参数
        // 二.处理业务
        // 1.校验员工姓名是否重复
        // 除开之前原姓名外，如果跟其他名字重复了，则表示重名了，不能修改
        // jiyong     jiyong
        // select count(1) where username = #{username} and id != ?
        Integer count = empMapper.findByNameNotId(emp.getUsername(), emp.getId());
        if(count > 0) {
            throw new RuntimeException("员工姓名已经存在，请更换新的！");
        }
        // 2.补全实体
        emp.setUpdateTime(LocalDateTime.now());
        // 3.修改员工
        empMapper.update(emp);
        // 三.封装数据
        return Result.success();
    }

    @Override
    public Result deleteByIds(List<Integer> ids) {
        if(Objects.isNull(ids) || ids.size() == 0){
            throw new RuntimeException("没有数据可删！");
        }
        empMapper.deleteByIds(ids);
        return Result.success();
    }

    @Override
    public Result login(Emp emp) {
        // 一.校验参数
        String username = emp.getUsername();
        String password = emp.getPassword();
        if(StringUtils.isNullOrEmpty(username) || StringUtils.isNullOrEmpty(password)) {
            throw new RuntimeException("用户名跟密码都不能为空！");
        }
        // 二.处理业务
        // 1.根据用户名查询用户信息
        Emp dbEmp = empMapper.findByUsername(username);
        // 2.判断用户是否为空
        if(Objects.isNull(dbEmp)) {
            throw new RuntimeException("用户不存在，请联系管理员！");
        }
        // 3.用户不为空，再比对密码
        if (!DigestUtils.md5DigestAsHex(password.getBytes()).equals(dbEmp.getPassword())) {
            // 4.密码不对，抛出异常
            throw new RuntimeException("用户名或密码错误！");
        }
        // 5.密码对了，数据脱敏
        //dbEmp.setPassword("");    //目前没有把密码返回给客户端，所以也无需进行脱敏
        // 三.封装数据
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", dbEmp.getId());
        claims.put("username", dbEmp.getUsername());
        String token = JwtUtils.generateJwt(claims);
        return Result.success(token);
    }
}
